/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pkgRoulette;

import Main.Frame;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Toolkit;
import java.util.*;
import javax.swing.*;

/**
 *
 * @Benoit Fortin
 */
public class Roulette extends JPanel {

    private Roulette roulette;
    final static int HAUTEUR = 600;//hauteur de la fenetre
    final static int LARGEUR = 850;//largeur de la fenetre
    public static int balle = 0;//Le numero de la bille/balle
    String titre = "Roulette";//Titre de la fenetre
    double gain = 0; //gain du joueur
    double miseTotal;//la miseTotal du joueur
    double differentiel;//différentiel du joueur
    ArrayList rouge = new ArrayList(); //arraylist contenant les nombre rouge
    ArrayList<JTextField> txtField = new ArrayList<JTextField>();// arraylist contenant les JTextfields
    ArrayList<JLabel> lbl = new ArrayList<JLabel>();//arraylist contenant les labels
    JPanel panneau1 = new JPanel(new GridLayout(1, 3)); //Premier panneau de l'utilisateur
    JPanel panneau2 = new JPanel(new GridLayout(5, 1));
    JPanel panneauMises = new JPanel(new GridLayout(16, 6));//panneau des mises
    JPanel pnlStatsDuJoueur = new JPanel(new GridLayout(4, 1));//panneau contenant les information utile au joueur
    JButton btnQuitter = new JButton("Quitter");//bouton pour revenir au menu principale
    JButton btnJouer = new JButton("Lancer la Bille");// bouton pour lancer la bille
    JButton btnRejouer = new JButton("Rejouer");//bouton pour rejouer
    JButton btnInitialisation = new JButton("Reinitialiser");//bouton pour initialiser toutes les mises a 0
    JPanel pnlQuedal;
    JLabel lblBalle = new JLabel("Bille:" + balle, JLabel.CENTER);
    JLabel lblMise = new JLabel("Mise : " + miseTotal + "$", JLabel.CENTER);
    JLabel lblArgent = new JLabel("Montant d'argent: " + "$", JLabel.CENTER);
    JLabel lblDifferentiel = new JLabel("Differentiel: " + differentiel + "$", JLabel.CENTER);
    JLabel lblNull = new JLabel("");
    private Random rnd = new Random();
    GererEvenementRoulette evenement;
    private Frame frame;

    /**
     * Constructeur de la classe Roulette
     * @param Frame: Le frame (cadre) dans lequel le panneau roulette est ajouté
     */
    public Roulette(Frame frame) {
        this.frame = frame;
        this.setLayout(new BorderLayout());
        frame.setSize(new Dimension(LARGEUR, HAUTEUR));// défini la taille de la fenetre
        evenement = new GererEvenementRoulette(this, frame);// la définition de l'écouteur d'action
        iniPanneaux();
        iniEvenements();
        iniRouge();
        this.add(panneau1);//ajoute le panneau a la fenetre
        setVisible(true);//permet de voir la fenetre
    }

    /**
     * Méthode qui initialise les Textes qui vont dans les panneaux, ainsi que les panneaux
     */
    public void iniPanneaux() {

        pnlQuedal = new JPanel(new GridLayout(1, 2));
        lblArgent = new JLabel("Montant d'argent: " + frame.argent + "$", JLabel.CENTER);
        //cré les 48 JTextfields des mises et les mets dans une arraylist
        for (int i = 0; i < 48; i++) {
            txtField.add(new JTextField("0"));
        }
        //création des 48 JLabel des mises et les mets dans une arraylist
        for (int i = 0; i < 36; i++) {
            lbl.add(new JLabel("" + (i + 1)));
        }
        lbl.add(new JLabel("Rouge"));
        lbl.add(new JLabel("Noire"));
        lbl.add(new JLabel("Pair"));
        lbl.add(new JLabel("Impair"));
        lbl.add(new JLabel("1-18"));
        lbl.add(new JLabel("19-36"));
        lbl.add(new JLabel("1-12"));
        lbl.add(new JLabel("13-24"));
        lbl.add(new JLabel("25-36"));
        lbl.add(new JLabel("Col 1"));
        lbl.add(new JLabel("Col 2"));
        lbl.add(new JLabel("Col 3"));

        pnlStatsDuJoueur.add(lblArgent);
        pnlStatsDuJoueur.add(lblMise);
        pnlStatsDuJoueur.add(lblDifferentiel);

        panneau2.add(pnlStatsDuJoueur);
        panneau2.add(btnJouer);
        panneau2.add(btnRejouer);
        panneau2.add(btnInitialisation);
        panneau2.add(btnQuitter);

        panneauMises.add(lbl.get(0));
        panneauMises.add(txtField.get(0));
        panneauMises.add(lbl.get(1));
        panneauMises.add(txtField.get(1));
        panneauMises.add(lbl.get(2));
        panneauMises.add(txtField.get(2));
        panneauMises.add(lbl.get(3));
        panneauMises.add(txtField.get(3));
        panneauMises.add(lbl.get(4));
        panneauMises.add(txtField.get(4));
        panneauMises.add(lbl.get(5));
        panneauMises.add(txtField.get(5));
        panneauMises.add(lbl.get(6));
        panneauMises.add(txtField.get(6));
        panneauMises.add(lbl.get(7));
        panneauMises.add(txtField.get(7));
        panneauMises.add(lbl.get(8));
        panneauMises.add(txtField.get(8));
        panneauMises.add(lbl.get(9));
        panneauMises.add(txtField.get(9));
        panneauMises.add(lbl.get(10));
        panneauMises.add(txtField.get(10));
        panneauMises.add(lbl.get(11));
        panneauMises.add(txtField.get(11));
        panneauMises.add(lbl.get(12));
        panneauMises.add(txtField.get(12));
        panneauMises.add(lbl.get(13));
        panneauMises.add(txtField.get(13));
        panneauMises.add(lbl.get(14));
        panneauMises.add(txtField.get(14));
        panneauMises.add(lbl.get(15));
        panneauMises.add(txtField.get(15));
        panneauMises.add(lbl.get(16));
        panneauMises.add(txtField.get(16));
        panneauMises.add(lbl.get(17));
        panneauMises.add(txtField.get(17));
        panneauMises.add(lbl.get(18));
        panneauMises.add(txtField.get(18));
        panneauMises.add(lbl.get(19));
        panneauMises.add(txtField.get(19));
        panneauMises.add(lbl.get(20));
        panneauMises.add(txtField.get(20));
        panneauMises.add(lbl.get(21));
        panneauMises.add(txtField.get(21));
        panneauMises.add(lbl.get(22));
        panneauMises.add(txtField.get(22));
        panneauMises.add(lbl.get(23));
        panneauMises.add(txtField.get(23));
        panneauMises.add(lbl.get(24));
        panneauMises.add(txtField.get(24));
        panneauMises.add(lbl.get(25));
        panneauMises.add(txtField.get(25));
        panneauMises.add(lbl.get(26));
        panneauMises.add(txtField.get(26));
        panneauMises.add(lbl.get(27));
        panneauMises.add(txtField.get(27));
        panneauMises.add(lbl.get(28));
        panneauMises.add(txtField.get(28));
        panneauMises.add(lbl.get(29));
        panneauMises.add(txtField.get(29));
        panneauMises.add(lbl.get(30));
        panneauMises.add(txtField.get(30));
        panneauMises.add(lbl.get(31));
        panneauMises.add(txtField.get(31));
        panneauMises.add(lbl.get(32));
        panneauMises.add(txtField.get(32));
        panneauMises.add(lbl.get(33));
        panneauMises.add(txtField.get(33));
        panneauMises.add(lbl.get(34));
        panneauMises.add(txtField.get(34));
        panneauMises.add(lbl.get(35));
        panneauMises.add(txtField.get(35));
        panneauMises.add(lbl.get(36));
        panneauMises.add(txtField.get(36));
        panneauMises.add(lbl.get(37));
        panneauMises.add(txtField.get(37));
        panneauMises.add(lbl.get(38));
        panneauMises.add(txtField.get(38));
        panneauMises.add(lbl.get(39));
        panneauMises.add(txtField.get(39));
        panneauMises.add(lbl.get(40));
        panneauMises.add(txtField.get(40));
        panneauMises.add(lbl.get(41));
        panneauMises.add(txtField.get(41));
        panneauMises.add(lbl.get(42));
        panneauMises.add(txtField.get(42));
        panneauMises.add(lbl.get(43));
        panneauMises.add(txtField.get(43));
        panneauMises.add(lbl.get(44));
        panneauMises.add(txtField.get(44));
        panneauMises.add(lbl.get(45));
        panneauMises.add(txtField.get(45));
        panneauMises.add(lbl.get(46));
        panneauMises.add(txtField.get(46));
        panneauMises.add(lbl.get(47));
        panneauMises.add(txtField.get(47));

        panneau1.add(panneau2);
        panneau1.add(panneauMises);
        panneau1.add(lblNull);

        btnJouer.setEnabled(false);
        btnRejouer.setEnabled(false);
    }

    /**
     * Méthode qui ajoute les ''écouteurs'' aux boutons et JTextfields
     */
    public void iniEvenements() {
        btnRejouer.addActionListener(evenement);
        btnJouer.addActionListener(evenement);

        //Ajoute des addActionListener sur les 48 JTextFields
        for (int i = 0; i < 48; i++) {
            txtField.get(i).addActionListener(evenement);
        }

        //Ajoute des addFocusListener sur les 48 JTextFields
        for (int i = 0; i < 48; i++) {
            txtField.get(i).addFocusListener(evenement);
        }

        //Ajoute les addKeyListener sur les 48 JTextFields
        for (int i = 0; i < 48; i++) {
            txtField.get(i).addKeyListener(evenement);
        }

        //ajoute des Actions Listener sur les différents boutons
        btnQuitter.addActionListener(evenement);
        btnInitialisation.addActionListener(evenement);
    }

    /**
     * Méthode qui initialise les nombres rouges dans une arrayList
     */
    public void iniRouge() {
        rouge.add(1);
        rouge.add(3);
        rouge.add(5);
        rouge.add(7);
        rouge.add(9);
        rouge.add(12);
        rouge.add(14);
        rouge.add(16);
        rouge.add(18);
        rouge.add(19);
        rouge.add(21);
        rouge.add(23);
        rouge.add(25);
        rouge.add(27);
        rouge.add(30);
        rouge.add(32);
        rouge.add(34);
        rouge.add(36);
    }

    /**
     * Méthode qui dessine l'image de la table de la roulette
     * @param g: Dessine une image
     */
    @Override
    public void paint(Graphics g) //methode pour dessiner
    {
        super.paint(g);
        //g.drawImage(img.get(0), 250, 500, null);
        g.drawImage(frame.ROULETTE, LARGEUR / 3 * 2 - 5, 0, null);
        frame.validate();
        frame.getRootPane();
        frame.repaint();
    }

    /**
     * Méthode qui s'occupe des règles de la roulette
     */
    public void regle()//methode compile les gains ou les pertes du joueur
    {

        balle = hasard(); // choisit une balle au hasard entre 0 et 36
        gain = 0;//initialise le gain a 0

        //Gain sur le nombre, il reçoit 35 fois sa mise        
        gain = Double.parseDouble(txtField.get(balle - 1).getText()) * 35;

        lblBalle.setForeground(Color.red);

        //Gain sur rouge et noire
        if (!(balle == 0)) {
            if (rouge.contains(balle)) {
                gain += Double.parseDouble(txtField.get(36).getText()) * 2;
            } else {
                gain += Double.parseDouble(txtField.get(37).getText()) * 2;
            }
            //Gain pour paire et impaire
            if (balle % 2 == 0)// Gain pour un nombre pair, 2 fois sa mise
            {
                gain += Double.parseDouble(txtField.get(38).getText()) * 2;
            } else if (balle % 2 == 1)// Gain pour un nombre impair, 2 fois sa mise
            {
                gain += Double.parseDouble(txtField.get(39).getText()) * 2;
            }

            //Gain pour les moitiés
            if (balle <= 18 && balle >= 1)// gain pour la premiere moitié (1-18), 2 fois sa msie
            {
                gain += Double.parseDouble(txtField.get(40).getText()) * 2;
            } else if (balle >= 19 && balle <= 36)// gain pour la deuxieme moitié (19-36), 2 fois sa mise
            {
                gain += Double.parseDouble(txtField.get(41).getText()) * 2;
            }

            //Gains pour les douzaines
            if (balle >= 1 && balle <= 12)// Gain pour la premiere douzaine (1-12), 3 fois sa mise
            {
                gain += Double.parseDouble(txtField.get(42).getText()) * 3;
            } else if (balle >= 13 && balle <= 24)// Gain pour la seconde douzaine (13-24), 3 fois sa mise
            {
                gain += Double.parseDouble(txtField.get(43).getText()) * 3;
            } else if (balle >= 25 && balle <= 36)// Gain pour la troisieme douzaine (25-36), 3 fois sa mise
            {
                gain += Double.parseDouble(txtField.get(44).getText()) * 3;
            }

            //Gain pour les colonnes
            if (balle % 3 == 0)// gain pour la premiere colonne, 3 fois sa mise
            {
                gain += Double.parseDouble(txtField.get(45).getText()) * 3;
            } else if (balle % 3 == 1)// gain pour la seconde colonne, 3 fois sa mise
            {
                gain += Double.parseDouble(txtField.get(46).getText()) * 3;
            } else if (balle % 3 == 2)// gain pour la troisieme colonne, 3 fois sa mise
            {
                gain += Double.parseDouble(txtField.get(47).getText()) * 3;
            }
        }

        //mise a jour des différents affichages monaitaire
        lblDifferentiel.setText("Differentiel: " + (differentiel + gain) + "$");
        lblArgent.setText("Montant d'argent: " + (frame.argent + gain) + "$");
        lblBalle.setText("Balle: " + balle);
        pnlStatsDuJoueur.add(lblBalle);
        repaint();
        //appel de la methode jouer
        jouer();
    }

    /**
     * Méthode qui s'occupe d'additionné la somme total des mises en jeu
     */
    public void totalMise() //Calcul le total de la somme mit en jeu par l'utilisation
    {
        miseTotal = 0;// initialise la mise a 0

        // Fait la somme de tous les montants entré
        for (int i = 0; i < 48; i++) {
            miseTotal += Double.parseDouble(txtField.get(i).getText());
        }
    }

    /**
     * Méthode qui s'occupe de l'activation/désactivation des boutons ainsi
     * que de la mise a jour des messages qui apparaissent a l'usager.
     */
    public void jouer() //Interface durant le tournage de la bille
    {
        //désactivation des différents composants
        for (int i = 0; i < 48; i++) {
            txtField.get(i).setEnabled(false);
        }
        btnQuitter.setEnabled(false);
        btnJouer.setEnabled(false);
        btnRejouer.setEnabled(true);
        btnInitialisation.setEnabled(false);
        frame.argent -= miseTotal;// ajuste le montant du joueur
        frame.argent += gain;// ajuste le montant du joueur
        differentiel -= miseTotal;// ajuste le différenciel du joueur
        differentiel += gain;// ajuste le différenciel du joueur
        lblArgent.setText("Montant d'argent: " + (frame.argent) + "$");// met a jour l'affichage
        lblDifferentiel.setText("Differentiel: " + (differentiel) + "$");// met a jour l'affichage
    }

    /**
     * Méthode qui prépare le programme pour une nouvelle partie
     */
    public void rejouer()// prepare une nouvellle partie
    {
        //réactivation des composants possibles
        for (int i = 0; i < 48; i++) {
            txtField.get(i).setEnabled(true);
        }
        btnQuitter.setEnabled(true);
        btnInitialisation.setEnabled(true);
        btnRejouer.setEnabled(false);

        //Activation conditionnelle du bouton jouer
        if (((miseTotal <= frame.argent) && (miseTotal > 0))) // si il lui reste de l'argent le bouton jouer est réactive
        {
            btnJouer.setEnabled(true);
        } else // sinon, un message lui signale qu'il n'a plus d'argent et desactive le bouton jouer
        {
            JOptionPane.showMessageDialog(null, "Vous n'avez plus de fond pour jouer. Il vous reste toujours la roulette russe pour vous refaire.");
            btnJouer.setEnabled(false);
        }

        pnlStatsDuJoueur.remove(3);
        repaint();
    }

    /**
     * Méthode qui vide tout les JtextFields
     */
    public void vider()//initialise a 0 tous les JTextfield
    {
        for (int i = 0; i < 48; i++) {
            txtField.get(i).setText("0");
        }
    }

    /**
     * @return le nombre sur lequel la bille a tombé
     */
    public int hasard() {
        return rnd.nextInt(36) + 1;
    }
}
